#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
一键抠图工具命令行界面
"""

import argparse
import sys
import os
from pathlib import Path
from .remover import BackgroundRemover

# 设置输出编码
if hasattr(sys.stdout, 'reconfigure'):
    sys.stdout.reconfigure(encoding='utf-8')
if hasattr(sys.stderr, 'reconfigure'):
    sys.stderr.reconfigure(encoding='utf-8')


def get_executable_dir():
    """获取当前执行文件的目录"""
    if getattr(sys, 'frozen', False):
        # 如果是打包后的exe文件
        return Path(sys.executable).parent
    else:
        # 如果是Python脚本
        return Path(os.getcwd())


def resolve_input_path(path_str, base_dir):
    """解析输入路径，相对于执行文件目录"""
    input_path = Path(path_str)
    if input_path.is_absolute():
        return input_path
    else:
        return base_dir / input_path


def create_parser():
    """创建命令行参数解析器"""
    parser = argparse.ArgumentParser(
        description="🎨 一键抠图工具 - AI智能背景移除",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
使用示例:
  # 处理单张图片
  python -m background_remover -i image.jpg
  
  # 批量处理目录下的所有图片
  python -m background_remover -d ./photos
  
  # 指定输出目录
  python -m background_remover -d ./photos -o ./output
  
  # 使用不同的AI模型
  python -m background_remover -i image.jpg -m u2net_human_seg
  
  # 添加新背景
  python -m background_remover --add-bg foreground.png background.jpg
        """
    )
    
    # 输入选项组 - 移除required=True以支持默认行为
    input_group = parser.add_mutually_exclusive_group(required=False)
    input_group.add_argument(
        "-i", "--input", 
        type=str, 
        help="输入图片文件路径"
    )
    input_group.add_argument(
        "-d", "--directory", 
        type=str, 
        help="输入图片目录路径（批量处理）"
    )
    
    # 背景替换选项
    parser.add_argument(
        "--add-bg", 
        nargs=2, 
        metavar=("FOREGROUND", "BACKGROUND"),
        help="为已抠图的图片添加新背景 (前景图片路径 背景图片路径)"
    )
    
    # 输出选项
    parser.add_argument(
        "-o", "--output", 
        type=str, 
        help="输出路径（文件或目录）"
    )
    
    # 模型选择
    parser.add_argument(
        "-m", "--model", 
        type=str, 
        default="u2net",
        choices=["u2net", "u2net_human_seg", "silueta"],
        help="选择AI模型 (默认: u2net)"
    )
    
    # 支持的文件格式
    parser.add_argument(
        "--extensions", 
        nargs="+", 
        default=[".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".webp"],
        help="支持的文件扩展名（批量处理时使用）"
    )
    
    # GUI模式选项
    parser.add_argument(
        "--gui", 
        action="store_true",
        help="启动图形界面模式"
    )
    
    # 版本信息
    parser.add_argument(
        "--version", 
        action="version", 
        version="一键抠图工具 v1.0.0"
    )
    
    return parser


def handle_single_image(args, remover, base_dir):
    """处理单张图片"""
    input_path = resolve_input_path(args.input, base_dir)
    
    if not input_path.exists():
        print(f"❌ 文件不存在: {input_path}")
        return False
    
    try:
        # 如果没有指定输出路径，则在执行文件同级目录创建
        if args.output:
            output_path = resolve_input_path(args.output, base_dir)
        else:
            output_path = base_dir / f"{input_path.stem}_no_bg.png"
        
        result = remover.remove_background(input_path, output_path)
        print(f"🎉 处理完成！输出文件: {result}")
        return True
    except Exception as e:
        print(f"❌ 处理失败: {e}")
        return False


def handle_directory(args, remover, base_dir):
    """批量处理目录"""
    input_dir = resolve_input_path(args.directory, base_dir)
    
    if not input_dir.exists() or not input_dir.is_dir():
        print(f"❌ 目录不存在: {input_dir}")
        return False
    
    try:
        # 如果没有指定输出目录，则在执行文件同级目录创建
        if args.output:
            output_dir = resolve_input_path(args.output, base_dir)
        else:
            output_dir = base_dir / "no_background"
        
        results = remover.batch_remove_background(
            input_dir, 
            output_dir, 
            args.extensions
        )
        
        if results:
            print(f"🎉 批量处理完成！处理了 {len(results)} 个文件")
            return True
        else:
            print("⚠️ 没有找到可处理的图片文件")
            return False
            
    except Exception as e:
        print(f"❌ 批量处理失败: {e}")
        return False


def handle_add_background(args, remover, base_dir):
    """添加新背景"""
    foreground_path_str, background_path_str = args.add_bg
    
    foreground = resolve_input_path(foreground_path_str, base_dir)
    background = resolve_input_path(background_path_str, base_dir)
    
    if not foreground.exists():
        print(f"❌ 前景图片不存在: {foreground}")
        return False
    
    if not background.exists():
        print(f"❌ 背景图片不存在: {background}")
        return False
    
    try:
        # 如果没有指定输出路径，则在执行文件同级目录创建
        if args.output:
            output_path = resolve_input_path(args.output, base_dir)
        else:
            output_path = base_dir / f"{foreground.stem}_new_bg.png"
        
        result = remover.add_new_background(foreground, background, output_path)
        print(f"🎉 背景替换完成！输出文件: {result}")
        return True
    except Exception as e:
        print(f"❌ 背景替换失败: {e}")
        return False


def main():
    """主函数"""
    print("[启动] 一键抠图工具启动中...")
    
    # 获取当前执行文件的目录
    base_dir = get_executable_dir()
    print(f"[目录] 工作目录: {base_dir}")
    
    parser = create_parser()
    args = parser.parse_args()
    
    # 处理 GUI 模式
    if args.gui:
        print("🎨 切换到GUI模式...")
        try:
            import tkinter
            # 测试 Tkinter 可用性
            test_root = tkinter.Tk()
            test_root.withdraw()  # 隐藏测试窗口
            test_root.destroy()   # 立即销毁
            
            from background_remover.gui import main as gui_main
            gui_main()
            return
        except ImportError:
            print("❌ GUI不可用（tkinter未安装）")
            print("解决方案: 重新安装Python时选择完整安装，或安装tkinter包")
            print("继续使用命令行模式...")
        except Exception as e:
            print(f"❌ GUI启动失败: {e}")
            if "init.tcl" in str(e) or "Tcl" in str(e):
                print("\n这是一个常见的Windows Tkinter配置问题，可以尝试以下解决方案:")
                print("1. 重新安装Python（选择完整安装）")
                print("2. 或者使用命令行模式进行抠图操作")
            print("继续使用命令行模式...")
    
    try:
        # 初始化背景移除器
        remover = BackgroundRemover(args.model)
        
        # 根据不同的操作模式执行相应功能
        if args.add_bg:
            success = handle_add_background(args, remover, base_dir)
        elif args.input:
            success = handle_single_image(args, remover, base_dir)
        elif args.directory:
            success = handle_directory(args, remover, base_dir)
        else:
            # 默认行为：处理photos目录
            photos_dir = base_dir / "photos"
            if photos_dir.exists() and photos_dir.is_dir():
                print("[默认] 未指定参数，自动处理photos目录...")
                # 创建一个模拟的args对象来处理photos目录
                class DefaultArgs:
                    def __init__(self):
                        self.directory = "photos"
                        self.output = None
                        self.extensions = [".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".webp"]
                
                default_args = DefaultArgs()
                success = handle_directory(default_args, remover, base_dir)
            else:
                print("[错误] 未找到photos目录，显示帮助信息...")
                parser.print_help()
                print("\n[提示] 默认情况下，程序会自动处理exe文件同目录下的photos文件夹")
                print("请确保在exe文件同目录下创建 photos 文件夹并放入图片文件")
                success = False
        
        if success:
            print("[成功] 任务执行成功！")
            # 如果是双击运行的exe文件，添加暂停功能
            if getattr(sys, 'frozen', False):
                print("\n[结果] 处理结果已保存在 'no_background' 目录中")
                input("\n按 Enter 键退出...")
            sys.exit(0)
        else:
            print("[失败] 任务执行失败！")
            # 如果是双击运行的exe文件，添加暂停功能
            if getattr(sys, 'frozen', False):
                input("\n按 Enter 键退出...")
            sys.exit(1)
            
    except KeyboardInterrupt:
        print("\n[中断] 用户中断操作")
        if getattr(sys, 'frozen', False):
            input("\n按 Enter 键退出...")
        sys.exit(1)
    except Exception as e:
        print(f"[异常] 程序异常: {e}")
        if getattr(sys, 'frozen', False):
            input("\n按 Enter 键退出...")
        sys.exit(1)


if __name__ == "__main__":
    main()